/* 						-*- coding: utf-8 -*-
 * Une version de history
 */

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include "history.h"

#define boucle 1 //vaut 1 si l'historique est circulaire, 0 sinon

char **commands;
int head = -1;		//indice de la plus ancienne commande enregistrée
int curr = -1;		//indice de la commande courrante
int end = -1;		//indice de la première case vide du tableau (prochaine entrée libre)
int empty_slots;	//nombre d'emplacements vides restants dans l'historique
int commands_size;

/* init. de  l'historique. size est le nombre de lignes a conserver en mémoire */
void init_history(int size) {
	commands = malloc(size*sizeof(char *));
	head = 0;
	curr = 0;
	end = 0;
	commands[end] = "";
	empty_slots = size;
	commands_size = size;
}

/* afficher l'historique dans le fichier f */
void print_history(FILE *f) {
	int i;
	for(i=head; i!=end; i++){
		i = i % commands_size;
		fprintf(f, "%s \n", commands[i]);
	}
} 

/* ajouter une ligne dans l'historique */
void add_history(const char *s) {
	if(head == -1) { //on initialise l'historique si ce n'est pas déjà fait
		init_history(HISTORY_DEFAULT_SIZE);
	}
	empty_slots--;
	if(empty_slots <= 0){ //si l'historique est plein, il faut décaler la tête
		head = head++ % commands_size;
	}
	// on place la nouvelle commande à l'indice end, puis on le décale
	commands[end] = strdup(s);
	end = (end + 1) % commands_size;
	commands[end] = "";
	curr = end;
}

/* avance/reculer dans l'historique */
char *previous_history(void){
	if(head == -1) { //on initialise l'historique si ce n'est pas déjà fait
		init_history(HISTORY_DEFAULT_SIZE);
	}
	if(head == end){ //si la tête est sur l'historique (aucune commande entrée)
		return "";
	}
	if(curr != head){
		curr = (curr > 0) ? curr-1 : commands_size-1;
	} else if(boucle) { // historique circulaire si boucle vaut 1, empêche de remonter dans l'historique si vaut 0
		curr = (curr > 0) ? curr-1 : ((end > 0) ? end-1 : end-1+commands_size);
	}
	return commands[curr];
}

char *next_history(void){
	if(head == -1) { //on initialise l'historique si ce n'est pas déjà fait
		init_history(HISTORY_DEFAULT_SIZE);
	}
	if(head == end){ //si la tête est sur l'historique (aucune commande entrée)
		return "";	
	}
	if(curr != end){
		curr = (curr + 1) % commands_size;
	}
	return commands[curr];
}
